// 入口文件
// 定义grunt自定执行的任务
// 导出一个函数
// 此函数接受一个形参, 内部提供一个创建任务时可以用到的API
const sass = require("sass");
const loadGruntTasks = require("load-grunt-tasks");
module.exports = (grunt) => {
  grunt.registerTask("foo", () => {
    console.log("hello grunt!");
  });
  grunt.registerTask("bar", "任务描述", () => {
    console.log("hello grunt again!");
  });
  // grunt.registerTask("default", () => {
  //   console.log("default grunt!");
  // });

  // grunt.registerTask("default", ["foo", "bad", "bar"]);

  // grunt.registerTask("async-task", () => {
  //   setTimeout(() => {
  //     console.log("async task working!");
  //   }, 1000);
  // });
  // 必须使用this.async得到回调函数 异步操作完成后调用这个回调函数
  // 表示任务已经被完成
  grunt.registerTask("async-task", function () {
    const done = this.async();
    setTimeout(() => {
      console.log("async working!");
      done();
    }, 1000);
  });

  grunt.registerTask("bad", () => {
    console.log("bad working~");
    return false;
  });
  // bad在任务列表中会导致后续的任务不会被执行
  // --force 失败的任务后面的任务还是会被执行
  // 异步任务 return false无法标记失败
  // done(false);
  grunt.registerTask("bad-async", function () {
    const done = this.async();
    setTimeout(() => {
      console.log("bad-async working!");
      done(false);
    }, 1000);
  });

  // 文件路径 ==========================================
  grunt.initConfig({
    aoo: "ban ban ban",
    boo: {
      bar: 123,
    },
  });
  grunt.registerTask("aoo", () => {
    console.log(grunt.config("aoo"));
  });
  grunt.registerTask("boo", () => {
    console.log(grunt.config("boo").bar);
    console.log(grunt.config("boo.bar"));
  });
  // yarn grunt boo

  // 多目标任务 =========================================
  // 配置目标
  // 指定目标build:css
  grunt.initConfig({
    // build: "ban ban ban",
    build: {
      options: {
        fooo: "barr",
      },
      css: {
        options: {
          // 覆盖options
          fooo: "大你",
        },
      },
      js: 456, // 默认的options
    },
    // 添加清除的信息
    clean: {
      // temp: "temp/app.js",
      // temp: "temp/*.txt",
      temp: "temp/**",
    },
    // 配置sass
    sass: {
      // options
      options: {
        souceMap: true,
        implementation: sass,
      },
      // main scss输入文件 输出文件的路径
      // css路径 :  原路径
      main: {
        files: {
          "dist/css/main.css": "src/scss/main.scss",
        },
      },
    },
    // babel目标配置
    babel: {
      // options 决定转换哪种ES特性
      // @babel/preset-env对应全部特性
      options: {
        sourceMap: true,
        presets: ["@babel/preset-env"],
      },
      main: {
        files: {
          "dist/js/app.js": "src/js/app.js",
        },
      },
    },
    // watch配置选项
    watch: {
      js: {
        files: ["src/js/*.js"],
        tasks: ["babel"],
      },
      css: {
        files: ["src/scss/*.scss"],
        tasks: ["sass"],
      },
    },
  });
  // 同时执行两个目标
  grunt.registerMultiTask("build", function () {
    // target没有options options作为配置选项出现
    // [Function (anonymous)]() 应该是一个返回配置选项的函数
    console.log(this.options());
    console.log(`target:${this.target}, data:${this.data}`);
  });
  // grunt 插件 =======================================
  // // npm安装 gruntfile载入 根据插件文档完成配置选项
  // grunt.loadNpmTasks("grunt-contrib-clean");
  // // grunt-sass
  // grunt.loadNpmTasks("grunt-sass");
  // 自动加载所有的grunt插件
  loadGruntTasks(grunt);
  // watch一开始不执行
  // 所以需要default先执行一遍sass和babel
  // 先启动在监听
  grunt.registerTask("default", ["sass", "babel", "watch"]);
};
